1

背景

最近入手了一台阿里云ECS,就寻思着搭建个个人博客,记录自己的一些技术研究,技术只有记下来才是属于你的,不记下来只是暂时属于你的。很多时候辛辛苦苦通宵熬夜研究技术解决了难题,如果当时没记下来下次要用的时候又得重新来一遍,永远不会成长。所以好记性不如烂笔头,学到新的东西要及时记下来,不仅对自己是技术积累的过程,也能惠及广大同行,何乐而不为。

一开始并不想把事情搞复杂,安装docker,运行wordpress官方docker镜像,一键完成部署。

docker run --name blog -p 80:80 -d wordpress

wordpress初次启动会有引导界面,通过引导界面输入数据库信息,初始化完数据库后就就完成了安装。

安装是非常方便,但问题也随之而来。

官方docker镜像没有中文版,后台管理界面是英文倒也不影响,但博客首页默认变成了英文,非常影响阅读,可以安装中文包,但需要修改wp-config.php文件,但由于wordpress源码打包在docker镜像里,修改起来较为复杂。因此决定放弃docker镜像,直接基于源码安装。在docker环境下基于源码安装需要以下几个镜像的配合:

  • php cgi docker镜像的选择
  • 负载均衡服务器的选择
  • 数据库

在wordpress中文网站下载最新wordpress源码,我下载的是最新版本WordPress 5.2.4,官网对WordPress 5.2.4要求PHP 7.3或者更高,MySQL 5.6或更高,在选择docker镜像的时候需要注意下,不然无法运行。

wordpress所有的官网打开都是429错误429 Too Many Requests,起初我以为是我网络的问题,但无论怎么切换网络都是429,我觉得这个问题已经超出技术范围,技术解决不了政治问题,429解决的办法只能是多刷新几次,直到刷出来为止。

PHP

PHP源码需要php cgi支持,在dockerhub上找到了php官方镜像,在tag里搜索fpm,可以查看各个 php-fpm版本,PHP-FPM(PHP FastCGI Process Manager)是为了更好的管理php-fastcgi而实现的一个程序,可以接收web服务器请求处理php脚本。

我选择了php:7.3-fpm作为wordpress运行环境。

docker run --name php -v /data/wordpress/src:/var/www/html -d php:7.3-fpm

/data/wordpress/src为wordpress源码目录,运行后访问报错

Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /var/www/html/wp-includes/wp-db.php:1645 Stack trace: #0 /var/www/html/wp-includes/wp-db.php(639): wpdb->db_connect() #1 /var/www/html/wp-includes/load.php(427): wpdb->__construct('wordpress', 'helen0226', 'wordpress', 'db:3306') #2 /var/www/html/wp-settings.php(120): require_wp_db() #3 /var/www/html/wp-config.php(88): require_once('/var/www/html/w...') #4 /var/www/html/wp-load.php(37): require_once('/var/www/html/w...') #5 /var/www/html/wp-blog-header.php(13): require_once('/var/www/html/w...') #6 /var/www/html/index.php(17): require('/var/www/html/w...') #7 {main} thrown in /var/www/html/wp-includes/wp-db.php on line 1645

看错误日志是缺少mysql相关模块。根据dockerhub上相关介绍,需要自行构建包含mysql模块的fpm镜像,通过工具docker-php-ext-install加入mysql模块,步骤也很简单,写一个Dockerfile文件即可。

FROM php:7.3-fpm
RUN docker-php-ext-install mysqli pdo pdo_mysql

保存为Dockerfile,执行以下命令构建新镜像。

docker build -t php:7.3-fpmx .

这里取了一个名字php:7.3-fpmx.

重新运行

docker run --name php -v /data/wordpress/src:/var/www/html -d php:7.3-fpmx

nginx

解决了php运行环境的问题,就要搭建负载均衡服务器,毕竟php只是cgi,还需要一个web服务器的支持。这里选择了nginx作为web服务器。

docker run --name nginx -v /data/nginx/conf.d:/etc/nginx/conf.d -v /data/wordpress/src:/usr/share/nginx/html --link php:php -p 2001:80 -d nginx

目录/data/nginx/conf.d下的配置文件default.conf如下

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index index.php index.html;

    }
    
    location ~ \.php$ {
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
        include        fastcgi_params;
    }
}
  • index index.php 设置根目录默认请求文件名。
  • /var/www/html/是php-fpm容器内的路径而非文件系统中的路径。

启动nginx后就可以通过nginx进行访问。

数据库

wordpress初次启动后需要输入数据库信息,如果没有可以当场搭建一个mysql数据库服务器。

# docker run --name mysql -p 2000:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d mysql

# docker exec -it mysql bash
root@ac169daba7b0:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 798
Server version: 8.0.18 MySQL Community Server - GPL

这里用的是8.0.18版本的mysql,可以通过docker exec命令进入mysql容器内,创建用户和数据库,脚本可以参考如下:

CREATE DATABASE  wordpress default charset utf8 COLLATE utf8_general_ci;

CREATE USER 'wordpress'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%';

ALTER USER 'wordpress'@'%' IDENTIFIED WITH mysql_native_password;
alter user 'wordpress'@'%' identified by 'password'

FLUSH   PRIVILEGES;

wordpress源码提供了一个配置文件的参考代码wp-config-sample.php,可以直接复制并重命名为wp-config.php。修改数据库连接信息

define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wordpress' );
define( 'DB_PASSWORD', 'password' );
define( 'DB_HOST', 'db:3306' );

这里db:3306用别名表示数据库,方便记忆和书写,可以通过docker命令 --link设置,link可以实现docker容器内互相通信。安装完mysql后重启php:

docker rm -f php
docker run --name php -v /data/wordpress/src:/var/www/html --link mysql:db -d php:7.3-fpmx

主题

将主题zip包复制到源码目录wp-content/themes下解压后,在wordpress的后台管理界面就可以看到主题。这里推荐一款比较喜欢的主题,coogee,可以直接点击这里进行下载。

插件

将插件zip包复制到源码目录wp-content/plugins下解压后,在wordpress的后台挂你就可以看到插件列表,对于技术博客,离不开的插件就是代码高亮,这里推荐一款代码高亮的插件Google Syntax Highlighter,点击这里可以直接下载。

写在最后

搭建一个个人博客并不是一件容易的事,还需要有一个域名,有了域名后还需要备案,如果你有过备案的经历你就懂了,还需要解决markdown到wordpress的转换,目前用了几个插件都不是很理想,主要是代码无法兼容高亮插件,这一点比较头疼,自己有过冲动想自己写一个markdown到wordpress html的转换程序,这当然是后话了。


DQuery
300 声望94 粉丝

幸福是奋斗出来的